package com.powernode.rules.service.impl;

import com.powernode.model.form.rules.ProfitsharingRuleRequest;
import com.powernode.model.form.rules.ProfitsharingRuleRequestForm;
import com.powernode.model.vo.rules.ProfitsharingRuleResponse;
import com.powernode.model.vo.rules.ProfitsharingRuleResponseVo;
import com.powernode.rules.config.DroolsHelper;
import com.powernode.rules.mapper.ProfitsharingRuleMapper;
import com.powernode.rules.service.ProfitsharingRuleService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.kie.api.runtime.KieSession;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;

/**
 * 利润分成规则服务实现类
 * 使用Drools规则引擎计算订单的利润分成费用
 */
@Slf4j  // 引入日志注解，用于记录日志
@Service  // 声明为Spring服务组件
@SuppressWarnings({"unchecked", "rawtypes"})  // 抑制未检查的类型转换和原始类型警告
public class ProfitsharingRuleServiceImpl implements ProfitsharingRuleService {
    @Resource  // 自动注入利润分成规则Mapper
    private ProfitsharingRuleMapper profitsharingRuleMapper;  // 用于访问利润分成规则数据

    /**
     * 计算订单利润分成费用
     * 根据订单金额、订单数量等条件，使用Drools规则引擎计算符合条件的利润分成金额
     *
     * @param profitsharingRuleRequestForm 利润分成规则请求表单，包含计算所需的参数
     * @return 利润分成规则响应对象，包含计算得到的分成金额等信息
     */
    @Override
    public ProfitsharingRuleResponseVo calculateOrderProfitsharingFee(ProfitsharingRuleRequestForm profitsharingRuleRequestForm) {
        // 创建利润分成规则请求对象，用于传递给Drools规则引擎
        ProfitsharingRuleRequest profitsharingRuleRequest = new ProfitsharingRuleRequest();
        // 设置订单金额，这是计算分成的关键参数之一
        profitsharingRuleRequest.setOrderAmount(profitsharingRuleRequestForm.getOrderAmount());
        // 设置订单数量，这是计算分成的关键参数之一
        profitsharingRuleRequest.setOrderNum(profitsharingRuleRequestForm.getOrderNum());

        //获取最新订单费用规则
        //ProfitsharingRule profitsharingRule = profitsharingRuleMapper.selectOne(new LambdaQueryWrapper<ProfitsharingRule>().orderByDesc(ProfitsharingRule::getId).last("limit 1"));
        // 加载Drools利润分成规则文件并创建KieSession会话
        // KieSession是Drools规则引擎的核心接口，用于执行规则
        KieSession kieSession = DroolsHelper.loadForRule("rules/ProfitsharingRule.drl");
        // 创建利润分成规则响应对象，用于存储规则执行后的分成结果
        ProfitsharingRuleResponse profitsharingRuleResponse = new ProfitsharingRuleResponse();
        // 设置全局变量，使规则可以直接操作该响应对象
        kieSession.setGlobal("profitsharingRuleResponse", profitsharingRuleResponse);
        // 将请求对象插入到工作内存中，供规则条件匹配使用
        kieSession.insert(profitsharingRuleRequest);
        // 触发并执行所有匹配的规则
        kieSession.fireAllRules();
        // 释放KieSession资源，避免内存泄漏
        kieSession.dispose();

        // 创建利润分成规则响应视图对象，用于返回给前端或调用方
        ProfitsharingRuleResponseVo profitsharingRuleResponseVo = new ProfitsharingRuleResponseVo();
        // 复制响应对象的属性值到视图对象
        BeanUtils.copyProperties(profitsharingRuleResponse, profitsharingRuleResponseVo);
        // 设置利润分成规则ID（固定为1L，可能需要根据实际业务调整）
        profitsharingRuleResponseVo.setProfitsharingRuleId(1L);
        // 返回包含利润分成信息的响应对象
        return profitsharingRuleResponseVo;
    }
}
